home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- * GEMTERM V1.2
- * 1992 by Martin F. Gergeleit
- * placed in the public domain
- *
- * GEMTERM COMES WITH ABSOLUTELY NO WARRANTY, NOR WILL I BE LIABLE FOR ANY
- * DAMAGES INCURRED FROM THE USE OF IT. USE ENTIRELY AT YOUR OWN RISK!!!
- *********************************************************************/
-
- #include <gemfast.h>
- #include <osbind.h>
- #include <mintbind.h>
- #include <signal.h>
- #include <filesys.h>
- #include <basepage.h>
- #include "vaproto.h"
- #include "txtwin.h"
- #include "gemterm.h"
-
- #ifdef DEBUG
- #include <stdio.h>
- #endif
-
- /* Gcc convention for accessories */
-
- char _stack_heap[0x8800];
- void *_heapbase = (void *)_stack_heap;
- long _stksize = sizeof(_stack_heap);
-
- #define NULL 0L
-
- #define GEMTERMMAGIC 01
- #define DO_DIALOG 0x01
- #define DO_KEEP 0x02
- #define NO_KEEP 0x04
-
- /* HIGH_POLLRATE when terminals are opend */
- #define HIGH_POLLRATE 1000/20
-
- /* LOW_POLLRATE when all terminals are closed */
- #define LOW_POLLRATE 750
-
- #define FILELEN 16
- #define TRBUFFERLEN 120
-
- /*********************************************************************/
- /* EXTERNALS */
- /*********************************************************************/
-
- extern int gl_apid;
- extern char args[];
- extern char *my_getenv();
- extern OBJECT *rs_trindex[];
- extern short _app;
-
- /*********************************************************************/
- /* GLOBAL VARIABLES */
- /*********************************************************************/
-
- short mint;
-
- int gl_hchar;
- int gl_wchar;
- int gl_wbox;
- int gl_hbox; /* system sizes */
-
- int menu_id ; /* our menu id */
- int my_pgrp;
-
- int phys_handle; /* physical workstation handle */
- int handle; /* virtual workstation handle */
- int top_window; /* handle of topped window */
-
- int xdesk,ydesk,hdesk,wdesk;
- GRECT screen;
-
- int msgbuff[8]; /* event message buffer */
- int keycode; /* keycode returned by event-keyboard */
- int mx,my; /* mouse x and y pos. */
- int butdown; /* button state tested for, UP/DOWN */
- int ret; /* dummy return variable */
-
- int work_in[11]; /* Input to GSX parameter array */
- int work_out[57]; /* Output from GSX parameter array */
- int pxyarray[10]; /* input point array */
-
- int default_font = 1;
- int default_height = 6;
- int max_font = 1;
- short got_font = FALSE;
-
- short got_infofile = FALSE;
- static char infofile[] = "U:\\etc\\gemterm.inf";
-
- int acc_closed = TRUE;
-
- char appl_name[9];
- int proto_status = 0;
-
- char *cmd_line;
-
- char copy_buffer[MAXCOPYLEN];
-
- char tr_buffer[TRBUFFERLEN];
- int tr_index = 0;
-
- char path[PATHLEN], file[FILELEN];
- char args[MAXARGLEN];
-
- char default_cwd[PATHLEN];
- short default_pers = FALSE;
- short default_keep = FALSE;
- short default_conv = FALSE;
-
- int tosrun = -1;
- int tty;
- short tty_used = FALSE;
-
- txt_win *my_win;
- int maxwins;
-
- short do_dialog = TRUE;
- short fromtosrun = FALSE;
- short tr_lock = FALSE;
-
- get_mint_vers()
- {
- long *cookie;
-
- #ifdef DEBUG
- fprintf(stderr, "get_mint_vers starts\n");
- #endif
-
- cookie = *((long **) 0x5a0);
- if (!cookie)
- mint = FALSE;
- else {
- while (*cookie) {
- if (*cookie == 0x4d694e54L) {
- mint = TRUE;
- #ifdef DEBUG
- fprintf(stderr, "get_mint_vers returns (mint = TRUE)\n");
- #endif
- return;
- }
- cookie += 2;
- }
- }
- mint = FALSE;
- #ifdef DEBUG
- fprintf(stderr, "get_mint_vers returns (mint = FALSE)\n");
- #endif
- }
-
- long pty_create(name)
- char *name;
- {
- long p;
- char string[] = "U:\\PIPE\\PTYA";
-
- #ifdef DEBUG
- fprintf(stderr, "pty_create starts\n");
- #endif
-
- while ((p = Fcreate(string, 0x04)) < 0)
- if (++string[strlen(string) - 1] > 'z') {
- #ifdef DEBUG
- fprintf(stderr, "pty_create returns -1\n", p);
- #endif
- return -1;
- }
- strcpy(name, string);
- Fcntl(p, 0, F_SETFD);
-
- #ifdef DEBUG
- fprintf(stderr, "pty_create returns %d\n", p);
- #endif
-
- return p;
- }
-
- main()
- {
- int i;
- int event;
- int win_index;
- int done;
- int mstatus;
- int pstatus;
- int count;
- GRECT win_rect;
- int ms_stat;
- int ms_stat_old = 0;
- struct sgttyb default_params;
- struct winsize wsize;
- long rusage[2];
-
- #ifdef DEBUG
- fprintf(stderr, "Gemterm starts\n");
- #endif
-
- Supexec(get_mint_vers);
-
- if (my_getenv("GEMTERMWINS"))
- maxwins = atoi(my_getenv("GEMTERMWINS"));
- if (maxwins <= 0)
- maxwins = 4;
-
- #ifdef DEBUG
- fprintf(stderr, "Try to create %d ptys\n", maxwins);
- #endif
-
- for (my_win = NULL; maxwins > 0; maxwins--) {
- my_win = (txt_win *)malloc(maxwins * sizeof(txt_win));
- if (my_win != NULL)
- break;
- }
-
- #ifdef DEBUG
- fprintf(stderr, "Memory for %d ptys\n", maxwins);
- #endif
-
- for (i = 0; i < maxwins; i++) {
- my_win[i].status = CLOSED;
- if (mint)
- my_win[i].my_pty = pty_create(my_win[i].my_pty_name);
- }
-
- if (mint) {
- char *tty_name;
-
- Fcntl(my_win[0].my_pty, &default_params, TIOCGETP);
-
- if ((tosrun = Fcreate("U:\\PIPE\\TOSRUN", 0)) >= 0)
- Fcntl(tosrun, 0, F_SETFD);
-
- if (tty_name = my_getenv("GEMTERMTTY"))
- tty = Fopen(tty_name, 2);
- else
- tty = Fopen("U:\\DEV\\MODEM1", 2);
-
- if (tty < 0)
- tty_used = TRUE; /* we will not use the tty */
- else
- Fcntl(tty, 0, F_SETFD);
- }
-
- #ifdef DEBUG
- fprintf(stderr, "opend tty, got fd: %d \n", tty);
- #endif
-
- if (mint)
- my_pgrp = Pgetpgrp();
-
- appl_init();
-
- if (!_app)
- menu_id=menu_register(gl_apid," Gemterm");
-
- fix_objects();
-
- if (_app) {
- menu_bar(rs_trindex[MENU], TRUE);
- graf_mouse(0,0);
- }
-
- #ifdef DEBUG
- fprintf(stderr, "Did GEM initialization\n");
- #endif
-
- wind_get(0, WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk);
- screen.g_x = xdesk;
- screen.g_y = ydesk;
- screen.g_w = wdesk;
- screen.g_h = hdesk;
-
- count = 10000;
- copy_buffer[0] = '\0';
-
- args[0] = 0;
- args[1] = '\0';
-
- strcpy(appl_name, "GEMINI ");
- if (my_getenv("GEMTERMAPPL") != 0) {
- strncpy(appl_name, my_getenv("GEMTERMAPPL"), 8);
- }
- for (i = strlen(appl_name); i < 8; i++)
- appl_name[i] = ' ';
-
- if (my_getenv("SHELL") == 0) {
- strcpy(path, "U:\\BIN\\");
- strcpy(file, "SH.TTP");
- }
- else {
- strcpy(path, my_getenv("SHELL"));
- for (i = strlen(path); i >= 0; i--) {
- if (path[i] == '\\')
- break;
- }
- strcpy(file, &path[i+1]);
- path[i+1] = '\0';
- }
-
- if (my_getenv("HOME") == 0)
- strcpy(default_cwd, "U:\\");
- else
- strcpy(default_cwd, my_getenv("HOME"));
-
- #ifdef DEBUG
- fprintf(stderr, "Starting GEM main loop\n");
- #endif
-
- if (_app)
- get_infofile();
-
- while (TRUE) {
- event = MU_TIMER;
- while (event == MU_TIMER) {
- event = evnt_multi(mint ? (MU_MESAG | MU_BUTTON | MU_KEYBD | MU_TIMER):
- MU_MESAG,
- 2,1,1,
- 0,0,0,0,0,
- 0,0,0,0,0,
- msgbuff,(long) (acc_closed ? LOW_POLLRATE : HIGH_POLLRATE),
- &mx,&my,&mstatus,&pstatus,&keycode,&ret);
-
- if (event & MU_TIMER) {
- count += 1000/(acc_closed ? LOW_POLLRATE : HIGH_POLLRATE);
- if (acc_closed) {
- for (i = 0; i < maxwins; i++) {
- if (my_win[i].status == TO_BE_REOPEND) {
- do_ac_reopen();
- break;
- }
- }
- }
-
- /* every 10 seconds ask for the Gemini font */
- if (count > 10000) {
- do_av_protocoll();
- count = 0;
- }
-
- if ((!tr_lock) && (tosrun >= 0)) {
- while (Finstat(tosrun) > 0) {
- tr_buffer[tr_index] = (char)Fgetchar(tosrun, 0);
- if (tr_index == (TRBUFFERLEN-1))
- tr_buffer[tr_index] = '\0';
- if (tr_buffer[tr_index++] == '\0') {
- tr_lock = TRUE;
- do_ac_open();
- tr_index = 0;
- }
- }
- }
-
-
- graf_mkstate(&ret, &ret, &ms_stat, &ret);
- if ((ms_stat & 0x2) && (!(ms_stat_old & 0x2))) {
- wind_get(0,WF_TOP,&top_window,&ret,&ret,&ret);
- win_index = find_window(top_window);
- if (win_index >= 0)
- for (i = 0; copy_buffer[i] != '\0'; i++)
- if (Foutstat(my_win[win_index].real_pty) >= 0){
- Fputchar(my_win[win_index].real_pty, copy_buffer[i], 0);
- }
- }
- ms_stat_old = ms_stat;
-
- for (i = 0; i < maxwins; i++) {
- txt_win *win = &my_win[i];
- if (win->status != CLOSED) {
- if ((win->pid != NO_PID) && (Pkill(win->pid, SIGNULL) != 0) &&
- (Finstat(win->real_pty) == 0)) {
- int client_pty;
- win->pid = NO_PID;
- if (win->keep_on_exit) {
- client_pty = Fopen(win->my_pty_name, 2);
- if (client_pty >= 0) {
- Fwrite(client_pty, 10, "\n\015<EXIT>\n\015");
- Fclose(client_pty);
- }
- }
- else {
- wind_update(TRUE);
- destroy_txt_win(win);
- wind_update(FALSE);
- }
- }
- if (Finstat(win->real_pty) != 0) {
- update_txt_win(win);
- }
- }
- }
- }
- }
-
- wind_update(TRUE);
- wind_get(0,WF_TOP,&top_window,&ret,&ret,&ret);
- cmd_line = NULL;
-
- if (event & MU_MESAG)
- switch (msgbuff[0]) {
-
- case MN_SELECTED:
- #ifdef DEBUG
- fprintf(stderr, "Got message MN_SELECTED\n");
- #endif
- menu_tnormal(rs_trindex[MENU], msgbuff[3], TRUE);
-
- if (msgbuff[4] == MQUIT) {
- for (i = 0; i < maxwins; i++) {
- if (my_win[i].pid != NO_PID)
- Pkill(-my_win[i].pid, SIGKILL);
-
- if (my_win[i].status == OPEN)
- close_txt_win(&my_win[i]);
- }
-
- menu_bar(rs_trindex[MENU], TRUE);
- v_clsvwk(handle);
- appl_exit();
- return;
- }
-
- else if (msgbuff[4] == MOPEN) {
- fromtosrun = FALSE;
- goto winopen;
- }
-
- else if (msgbuff[4] == MCLOSE) {
- win_index = find_window(top_window);
- goto winclose;
- }
-
- else if (msgbuff[4] == MSAVE) {
- i = 0;
- goto do_save;
- }
-
- else if (msgbuff[4] == MABOUT) {
- form_alert(1,"[0][ Gemterm V1.2|M. Gergeleit 1992 ][Ok]");
- }
-
- break;
-
- case AC_CLOSE:
- #ifdef DEBUG
- fprintf(stderr, "Got message AC_CLOSE\n");
- #endif
-
- if (msgbuff[3] == menu_id) {
- for (i = 0; i < maxwins; i++) {
- if (my_win[i].status == OPEN) {
- my_win[i].status = my_win[i].persistent ? TO_BE_REOPEND : UNSHOWN;
- }
- }
-
- if (!acc_closed) {
- v_clsvwk(handle);
- acc_closed = TRUE;
- }
-
- do_av_protocoll();
- }
- break;
-
- case GEMTERM_REOPEN:
- #ifdef DEBUG
- fprintf(stderr, "Got message GEMTERM_REOPEN\n");
- #endif
-
- if (msgbuff[1] == gl_apid) {
-
- open_vwork();
-
- for (i = 0; i < maxwins; i++) {
- if (my_win[i].status==TO_BE_REOPEND) {
- open_txt_win(&my_win[i]);
- if (my_win[i].status==OPEN)
- do_av_accwindopen(my_win[i].handle);
- }
- }
- }
- break;
-
- case TOS_RUN_START:
- #ifdef DEBUG
- fprintf(stderr, "Got message TOS_RUN_OPEN\n");
- #endif
- {
- short start;
- short len;
-
- do_dialog = FALSE;
- fromtosrun = TRUE;
-
- len = strlen(tr_buffer);
-
- i = 0;
- if (tr_buffer[0] == GEMTERMMAGIC) {
- i = 2;
- if (tr_buffer[1] & DO_DIALOG)
- do_dialog = TRUE;
- if (tr_buffer[1] & NO_KEEP)
- default_keep = FALSE;
- if (tr_buffer[1] & DO_KEEP)
- default_keep = TRUE;
- }
-
- for (start = i; i < len; i++)
- if (tr_buffer[i] == ' ') {
- tr_buffer[i++] = '\0';
- break;
- }
- strcpy (default_cwd, &tr_buffer[start]);
-
- for (start = i; i < len; i++)
- if (tr_buffer[i] == ' ') {
- tr_buffer[i++] = '\0';
- break;
- }
- strcpy (&args[1], &tr_buffer[i]);
- args[0] = (char)strlen(&tr_buffer[i]);
-
- strcpy(path, &tr_buffer[start]);
- for (i = strlen(path); i >= 0; i--) {
- if (path[i] == '\\')
- break;
- }
- strcpy(file, &path[i+1]);
- path[i+1] = '\0';
-
- tr_lock = FALSE;
- }
- goto winopen;
-
-
- case VA_START:
- #ifdef DEBUG
- fprintf(stderr, "Got message VA_START\n");
- #endif
-
- cmd_line = (char *)(((long)msgbuff[3]<<16) | ((long)msgbuff[4] & 0xffff));
- if ((cmd_line != NULL) && (cmd_line[0] == '\0'))
- cmd_line = NULL;
- fromtosrun = FALSE;
- do_dialog = TRUE;
- goto winopen;
-
- case AC_OPEN:
- #ifdef DEBUG
- fprintf(stderr, "Got message AC_OPEN\n");
- #endif
-
- if (msgbuff[4] == menu_id) {
- fromtosrun = FALSE;
- do_dialog = TRUE;
- winopen:
- open_vwork();
-
- if (!mint) {
- form_alert(1,"[0][MiNT is not active ][Hmm]");
- break;
- }
-
- if (get_infofile())
- break;
-
- done = FALSE;
- for (i = 0; i < maxwins; i++) {
- if ((my_win[i].status == UNSHOWN) ||
- (my_win[i].status == TO_BE_REOPEND)) {
- open_txt_win(&my_win[i]);
- if (my_win[i].status==OPEN)
- do_av_accwindopen(my_win[i].handle);
- done = TRUE;
- }
- }
- if (done && (cmd_line == NULL) && (!fromtosrun))
- break;
-
- for (win_index = 0; (my_win[win_index].status != CLOSED) &&
- (win_index < maxwins); win_index++);
-
- if(win_index != maxwins){
- if (my_win[win_index].pid != NO_PID)
- Pkill(-my_win[win_index].pid, SIGKILL);
-
- i = do_select_dialog(&my_win[win_index], &cmd_line);
- if (i == -1)
- break;
-
- do_save:
- if (i == 0) {
- int savefd;
- int w;
- char *filename;
-
- if ((filename = my_getenv("GEMTERMINF")) == 0)
- filename = infofile;
-
- #ifdef DEBUG
- fprintf(stderr, "opening %s\n", filename);
- #endif
-
- Fdelete(filename);
- if ((savefd = Fcreate(filename, 0)) >= 0) {
-
- #ifdef DEBUG
- fprintf(stderr, "start writing %s\n", filename);
- #endif
-
- Fwrite (savefd, PATHLEN, path);
- Fwrite (savefd, FILELEN, file);
- Fwrite (savefd, MAXARGLEN, args);
- Fwrite (savefd, PATHLEN, default_cwd);
- Fwrite (savefd, sizeof(default_font), &default_font);
- Fwrite (savefd, sizeof(default_height), &default_height);
- Fwrite (savefd, sizeof(default_pers), &default_pers);
- Fwrite (savefd, sizeof(default_keep), &default_keep);
- Fwrite (savefd, sizeof(default_conv), &default_conv);
- for (w = 0; w < maxwins; w++)
- if ((my_win[w].status == OPEN) &&
- ((my_win[w].pid != NO_PID) || (my_win[w].real_pty == tty)))
- write_txt_win(&my_win[w], savefd);
-
- Fclose(savefd);
- #ifdef DEBUG
- fprintf(stderr, "writing of %s completed\n", filename);
- #endif
- }
- break;
- }
-
- if (cmd_line != NULL)
- strncpy(my_win[win_index].window_name, cmd_line, WINDOW_NAME_LEN);
- else if (my_win[win_index].real_pty == tty) {
- tty_used = TRUE;
- strncpy(my_win[win_index].window_name,"Terminal", WINDOW_NAME_LEN);
- }
- else
- strncpy(my_win[win_index].window_name,
- my_win[win_index].my_pty_name, WINDOW_NAME_LEN);
- my_win[win_index].window_name[WINDOW_NAME_LEN-1] = '\0';
-
- strcpy(my_win[win_index].cwdir, default_cwd);
- strcpy(my_win[win_index].my_args, args);
-
- init_txt_win(&my_win[win_index],default_font,default_height);
- if (my_win[win_index].wtext == 0)
- break;
-
- open_txt_win(&my_win[win_index]);
- if (my_win[win_index].status != OPEN) {
- my_win[win_index].status = CLOSED;
- break;
- }
-
- do_av_accwindopen(my_win[win_index].handle);
-
- wsize.ws_row = my_win[win_index].lines;
- wsize.ws_col = my_win[win_index].cols;
- wsize.ws_xpixel = my_win[win_index].cols *
- my_win[win_index].c_width;
- wsize.ws_ypixel = my_win[win_index].lines *
- my_win[win_index].c_height;
- Fcntl(my_win[win_index].real_pty, &wsize, TIOCSWINSZ);
-
- if (cmd_line == NULL)
- break;
-
- #ifdef DEBUG
- fprintf(stderr, "start forking new process\n");
- #endif
- {
- int f0, f1, f2, fm1, client_pty;
- int savedrive;
- char savedir[PATHLEN];
-
- client_pty = Fopen(my_win[win_index].my_pty_name, 2);
- if (client_pty < 0) {
- form_alert(1,"[0][Can not open client pty ][Hmm]");
- }
- else {
- f0 = Fdup(0);
- Fforce(0, client_pty);
- f1 = Fdup(1);
- Fforce(1, client_pty);
- f2 = Fdup(2);
- Fforce(2, client_pty);
- fm1 = Fdup(-1);
- Fforce(-1, client_pty);
- Fclose(client_pty);
-
- savedrive = Dgetdrv();
- Dgetpath(savedir, savedrive+1);
- Dsetdrv(my_win[win_index].cwdir[0] - 'A');
- Dsetpath(&my_win[win_index].cwdir[2]);
-
- if ((my_win[win_index].pid =
- Pexec(100, cmd_line, args, _base->p_env)) < 0) {
- my_win[win_index].pid = NO_PID;
- form_alert(1,"[0][Can not execute program ][Hmm]");
- } else {
- #ifdef DEBUG
- fprintf(stderr, "new process created\n");
- #endif
- Fcntl(my_win[win_index].my_pty, &default_params, TIOCSETP);
- Fcntl(my_win[win_index].real_pty, &my_win[win_index].pid,
- TIOCSPGRP);
- Psetpgrp(my_win[win_index].pid, my_win[win_index].pid);
- Prenice(my_win[win_index].pid, -10);
- }
-
- Dsetdrv(savedrive);
- Dsetpath(savedir);
-
- Fforce(0, f0);
- Fclose(f0);
- Fforce(1, f1);
- Fclose(f1);
- Fforce(2, f2);
- Fclose(f2);
- Fforce(-1, fm1);
- Fclose(fm1);
- }
- }
- }
- }
- #ifdef DEBUG
- fprintf(stderr, "open completed\n");
- #endif
- break;
-
- case VA_PROTOSTATUS:
- #ifdef DEBUG
- fprintf(stderr, "Got message VA_PROTOSTATUS\n");
- #endif
- proto_status = msgbuff[3];
-
- if (!got_font)
- do_av_askfilefont();
- break;
-
- case VA_FILEFONT:
- #ifdef DEBUG
- fprintf(stderr, "Got message VA_FILEFONT\n");
- #endif
-
- default_font = msgbuff[3];
- default_height = msgbuff[4];
- got_font = TRUE;
- get_infofile();
- break;
-
- case VA_DRAGACCWIND:
- #ifdef DEBUG
- fprintf(stderr, "Got message VA_DRAGACCWIND\n");
- #endif
-
- cmd_line = (char *)(((long)msgbuff[6]<<16) | ((long)msgbuff[7] & 0xffff));
- if (cmd_line != NULL) {
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0)
- for (i = 0; i < strlen(cmd_line); i++) {
- if (my_win[win_index].backslash_conv && (cmd_line[i] == '\\'))
- cmd_line[i] = '/';
- if (Foutstat(my_win[win_index].real_pty) > 0)
- Fputchar(my_win[win_index].real_pty, (long)cmd_line[i], 0);
- }
- }
- break;
-
- case WM_REDRAW:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_REDRAW\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0)
- win_rect.g_x = msgbuff[4];
- win_rect.g_y = msgbuff[5];
- win_rect.g_w = msgbuff[6];
- win_rect.g_h = msgbuff[7];
- redraw_txt_win(&my_win[win_index], &win_rect);
- break;
-
- /* case WM_NEWTOP:*/
- case WM_TOPPED:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_TOPPED\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0)
- top_txt_win(&my_win[win_index]);
- break;
-
- case WM_CLOSED:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_CLOSED\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- winclose:
- if (win_index >= 0){
- do_av_accwindclosed(my_win[win_index].handle);
- if (pstatus & 0x4) { /* Control Key */
- if (my_win[win_index].pid != NO_PID)
- Pkill(-my_win[win_index].pid, SIGHUP);
- Fcntl(my_win[win_index].real_pty, &my_pgrp, TIOCSPGRP);
- destroy_txt_win(&my_win[win_index]);
- if (my_win[win_index].real_pty == tty)
- tty_used = FALSE;
- }
- else if (pstatus & 0x8) { /* Alt Key */
- if (my_win[win_index].pid != NO_PID)
- Pkill(-my_win[win_index].pid, SIGKILL);
- Fcntl(my_win[win_index].real_pty, &my_pgrp, TIOCSPGRP);
- destroy_txt_win(&my_win[win_index]);
- if (my_win[win_index].real_pty == tty)
- tty_used = FALSE;
- }
- else
- close_txt_win(&my_win[win_index]);
- }
- break;
-
- case WM_SIZED:
- case WM_MOVED:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_SIZED or WM_MOVED\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0){
- size_txt_win(&my_win[win_index],
- msgbuff[4],msgbuff[5],msgbuff[6],msgbuff[7]);
- }
- break;
-
- case WM_FULLED:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_FULLED\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0){
- full_txt_win(&my_win[win_index]);
- }
- break;
-
- case WM_ARROWED:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_ARROWED\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0){
- arrow_txt_win(&my_win[win_index], msgbuff[4]);
- }
- break;
-
- case WM_HSLID:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_HSLID\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0){
- hslid_txt_win(&my_win[win_index], msgbuff[4]);
- }
- break;
-
- case WM_VSLID:
- #ifdef DEBUG
- fprintf(stderr, "Got message WM_VSLID\n");
- #endif
-
- win_index = find_window(msgbuff[3]);
- if (win_index >= 0){
- vslid_txt_win(&my_win[win_index], msgbuff[4]);
- }
- break;
-
- } /* switch (msgbuff[0]) */
-
- if (event & MU_BUTTON) {
- #ifdef DEBUG
- fprintf(stderr, "Got button event\n");
- #endif
-
- win_index = find_window(top_window);
- if (win_index >= 0)
- mouse_txt_win(&my_win[win_index], mx, my, 1);
- }
-
- if(event & MU_KEYBD){
- #ifdef DEBUG
- fprintf(stderr, "Got keyboard event\n");
- #endif
-
- win_index = find_window(top_window);
- if (win_index >= 0){
- if (Foutstat(my_win[win_index].real_pty) >= 0){
- Fputchar(my_win[win_index].real_pty,
- (keycode & 0xff) | ((keycode & 0xff00) << 8), 1);
- }
- }
- }
-
- /* find the zomies, but only if I am an application, an accessory
- should not collect the processes of its main appl */
- if (mint && _app)
- while (Pwait3(1, &rusage[0]) > 0);
-
- wind_update(FALSE);
-
- } /* while (TRUE) */
- }
-
- int find_window(txt_win_handle)
- int txt_win_handle;
- {
- int i;
-
- for (i = 0; i < maxwins; i++)
- if (my_win[i].handle == txt_win_handle) {
- #ifdef DEBUG
- fprintf(stderr, "find_window returns %d\n", i);
- #endif
- return i;
- }
- #ifdef DEBUG
- fprintf(stderr, "find_window returns -1 (not found)\n");
- #endif
- return -1;
- }
-
- open_vwork()
- {
- int i;
-
- #ifdef DEBUG
- fprintf(stderr, "open_vwork starts\n");
- #endif
-
- if (!acc_closed) {
- #ifdef DEBUG
- fprintf(stderr, "workstation already open\n");
- #endif
- return;
- }
-
- phys_handle=graf_handle(&gl_wchar,&gl_hchar,&gl_wbox,&gl_hbox);
-
- for(i=1;i<10;work_in[i++]=1);
- work_in[0]=Getrez()+2;
- work_in[10]=2;
- handle=phys_handle;
- v_opnvwk(work_in,&handle,work_out);
-
- if (vq_gdos())
- max_font = _intout[10] + vst_load_fonts(handle, 0);
- #ifdef DEBUG
- fprintf(stderr, "max_font = %d\n", max_font);
- #endif
- vsf_interior(handle,0);
- vsf_style(handle,8);
- vsf_color(handle,0);
- vst_alignment(handle, 0, 5, &ret, &ret);
-
- acc_closed = FALSE;
-
- #ifdef DEBUG
- fprintf(stderr, "open_vwork ends\n");
- #endif
- }
-
- int get_infofile ()
- {
- int i;
- int savefd;
- int ret = FALSE;
- char *filename;
-
- #ifdef DEBUG
- fprintf(stderr, "get_infofile starts\n");
- #endif
-
- if (!got_infofile) {
- if (!mint) {
- form_alert(1,"[0][MiNT is not active ][Hmm]");
- got_infofile = TRUE;
- return TRUE;
- }
-
- open_vwork();
-
- if ((filename = my_getenv("GEMTERMINF")) == 0)
- filename = infofile;
- if ((savefd = Fopen(filename, 0)) >= 0) {
- Fread (savefd, PATHLEN, path);
- Fread (savefd, FILELEN, file);
- Fread (savefd, MAXARGLEN, args);
- Fread (savefd, PATHLEN, default_cwd);
- Fread (savefd, sizeof(default_font), &default_font);
- Fread (savefd, sizeof(default_height), &default_height);
- default_font = vst_font(handle, default_font);
- default_height = vst_point(handle, default_height, &ret,&ret,&ret,&ret);
- Fread (savefd, sizeof(default_pers), &default_pers);
- Fread (savefd, sizeof(default_keep), &default_keep);
- Fread (savefd, sizeof(default_conv), &default_conv);
-
- for (i = 0; i < maxwins; i++) {
- if (my_win[i].status == CLOSED) {
- read_txt_win(&my_win[i], savefd);
- }
- }
- Fclose(savefd);
- ret = TRUE;
- }
- got_infofile = TRUE;
- }
- #ifdef DEBUG
- fprintf(stderr, "get_infofile returns %d\n", ret);
- #endif
-
- return ret;
- }
-